package com.jdk._03_接口默认方法;

/**
 * 接口默认方法、静态方法
 * 默认方法使用关键字 default 标识
 * 类比抽象类的默认实现，子类可以不主动实现该方法
 * <p>
 * 原则1：类优先
 * 如果，实现类继承了其他父类，并且父类中存在同名方法，那么优先调用父类中的方法
 * <p>
 * 原则2：冲突指定
 * 当当实现多个接口时，如果存在同名同参的方法，将出现冲突，存在两种解决
 * 1.实现该方法，重写逻辑
 * 2.实现该方法，指定使用哪个接口的默认实现
 * <p>
 * 注：JDK9中还包含 private 声明
 */
public class _Test {
    /**
     * 输出结果
     * <p>
     * 【class】【A】【sout1】
     * 【default】【Interface001】【sout2】
     * 【class】【Parent】【parent】
     * <p>
     * 【class】【B】【sout1】
     * 【default】【Interface002】【sout2】
     * <p>
     * 【class】【C】【sout1】
     * 【default】【Interface001】【sout2】
     */
    public static void main(String[] args) {
        Interface001.static_();

        A a = new A();
        a.sout1();
        a.sout2();
        a.parent();
        System.out.println();

        B b = new B();
        b.sout1();
        b.sout2();
        System.out.println();

        C c = new C();
        c.sout1();
        c.sout2();

    }

    interface Interface001 {
        void sout1();

        default void sout2() {
            System.out.println("【default】【Interface001】【sout2】");
        }

        default void parent() {
            System.out.println("【default】【Interface001】【parent】");
        }

        static void static_() {
            System.out.println("【default】【Interface001】【static_】");
        }
    }

    interface Interface002 {
        void sout1();

        default void sout2() {
            System.out.println("【default】【Interface002】【sout2】");
        }

    }

    static class Parent {
        public void parent() {
            System.out.println("【class】【Parent】【parent】");
        }
    }

    static class A extends Parent implements Interface001 {
        @Override
        public void sout1() {
            System.out.println("【class】【A】【sout1】");
        }
    }

    static class B implements Interface002 {
        @Override
        public void sout1() {
            System.out.println("【class】【B】【sout1】");
        }
    }

    /**
     * 对默认实现方法，出现冲突时，存在两种解决
     * 1.实现该方法，重写逻辑
     * 2.实现该方法，指定使用哪个接口的默认实现
     */
    static class C extends Parent implements Interface001, Interface002 {

        @Override
        public void sout1() {
            System.out.println("【class】【C】【sout1】");

        }

        @Override
        public void sout2() {
            Interface001.super.sout2();
        }

    }


}
